package com.leetcode.partition1;

import java.util.Arrays;

/**
 * @author `RKC`
 * @date 2021/9/17 8:32
 */
public class LC36有效的数独 {

    public static boolean isValidSudoku(char[][] board) {
        return hashtable(board);
    }

    private static boolean hashtable(final char[][] board) {
        int[][] rowHt = new int[board.length][board[0].length];              //记录行rowHt[i][j]代表第i行数字j出现的次数
        int[][] colHt = new int[board.length][board[0].length];              //记录列colHt[i][j]代表第i列数字j出现的次数
        int[][] blockHt = new int[9][9];                //记录从上到下，从左到右的9格块中的数字出现的次数
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board.length; j++) {
                if (board[i][j] != '.') {
                    int key = board[i][j] - '1', blockIndex = i / 3 * 3 + j / 3;
                    rowHt[i][key]++;
                    colHt[j][key]++;
                    blockHt[blockIndex][key]++;
                    //当某行、某列或者某块中出现使用相同的数字，即可判定不合法
                    if (rowHt[i][key] > 1 || colHt[j][key] > 1 || blockHt[blockIndex][key] > 1) {
                        return false;
                    }
                }
            }
        }
        System.out.println("行哈希：");
        Arrays.stream(rowHt).forEach(item -> System.out.println(Arrays.toString(item)));
        System.out.println("列哈希：");
        Arrays.stream(colHt).forEach(item -> System.out.println(Arrays.toString(item)));
        System.out.println("块哈希：");
        Arrays.stream(blockHt).forEach(item -> System.out.println(Arrays.toString(item)));
        return true;
    }

    public static void main(String[] args) {
        char[][] board = {
                {'5', '3', '.', '.', '7', '.', '.', '.', '.'},
                {'6', '.', '.', '1', '9', '5', '.', '.', '.'},
                {'.', '9', '8', '.', '.', '.', '.', '6', '.'},
                {'8', '.', '.', '.', '6', '.', '.', '.', '3'},
                {'4', '.', '.', '8', '.', '3', '.', '.', '1'},
                {'7', '.', '.', '.', '2', '.', '.', '.', '6'},
                {'.', '6', '.', '.', '.', '.', '2', '8', '.'},
                {'.', '.', '.', '4', '1', '9', '.', '.', '5'},
                {'.', '.', '.', '.', '8', '.', '.', '7', '9'}
        };
        char[][] board1 = {
                {'8', '3', '.', '.', '7', '.', '.', '.', '.'},
                {'6', '.', '.', '1', '9', '5', '.', '.', '.'},
                {'.', '9', '8', '.', '.', '.', '.', '6', '.'},
                {'8', '.', '.', '.', '6', '.', '.', '.', '3'},
                {'4', '.', '.', '8', '.', '3', '.', '.', '1'},
                {'7', '.', '.', '.', '2', '.', '.', '.', '6'},
                {'.', '6', '.', '.', '.', '.', '2', '8', '.'},
                {'.', '.', '.', '4', '1', '9', '.', '.', '5'},
                {'.', '.', '.', '.', '8', '.', '.', '7', '9'},
        };
        System.out.println(isValidSudoku(board));
        System.out.println(isValidSudoku(board1));
    }
}
